<!DOCTYPE html><html><head><title>潭州Java学院—Nginx教程</title><meta charset='utf-8'><link href='https://dn-maxiang.qbox.me/res-min/themes/marxico.css' rel='stylesheet'><style></style></head><body><div id='preview-contents' class='note-content'>
                        
                    



<h1 id="潭州java学院nginx教程">潭州Java学院—Nginx教程</h1>

<hr>



<h2 id="第一堂课nginx的介绍与安装">第一堂课：Nginx的介绍与安装</h2>



<h4 id="常用的web服务器简介">常用的Web服务器简介</h4>

<blockquote>
  <p>查看服务器的市场占有率：<a href="https://news.netcraft.com/" target="_blank">https://news.netcraft.com/</a></p>
</blockquote>

<ul><li><p><strong>Apache</strong> <br>
Apache(<a href="http://httpd.apache.org" target="_blank">http://httpd.apache.org</a>), apache仍然是世界上用的最多的Web服务器，市场占有率60%左右，模块非常丰富，系统稳定，可移值性好，但是比较消耗资源。</p></li>
<li><p><strong>Lighttpd</strong> <br>
Lighttpd(<a href="http://www.lighttpd.net" target="_blank">http://www.lighttpd.net</a>), Lighttpd是一个德国人写的开源软件，目标是提供一个高性的网站，它具有内存开销低，CPU占有率低，效能好以及模块丰富，是Nginx的重要竞争对手之一。</p></li>
<li><p><strong>Tomcat</strong> <br>
Tomcat(<a href="http://tomcat.apache.org" target="_blank">http://tomcat.apache.org</a>), Tomcat是一个开源，运行servlet和jsp web应用软件的基于Java的web服务器，但是Tomcat对静态文件、高并发的处理能力弱。</p></li>
<li><p><strong>WebSphere</strong> <br>
IBM WebSphere服务器，WebSphere是一种功能完善、开放的web应用程序服务器，是IBM电子商务计划的核心部分，它是基于Java的应用环境，范围从简单到高级直至企业级，相对于其他Web服务器来说，应用数量少。</p></li>
<li><p><strong>IIS</strong> <br>
Microsoft IIS， Internet Information Services（IIS，互联网信息服务），是由微软公司提供的基于运行Microsoft Windows的互联网基本服务。最初是Windows NT版本的可选包，随后内置在Windows 2000、Windows XP Professional和Windows Server 2003一起发行，但在Windows XP Home版本上并没有IIS。IIS是一种Web服务组件，其中包括web服务器、FTP服务等。</p></li>
</ul>



<h4 id="什么是nginx">什么是Nginx?</h4>

<blockquote>
  <p>Nginx是俄罗斯人Lgor Sysoev(塞索耶夫)编写的一款高性能的HTTP和反向代理服务器。</p>
</blockquote>



<h4 id="nginx-是一个高性能的-web-和反向代理服务器-它具有有很多非常优越的特性">Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性:</h4>

<ul><li><p><strong>作为 Web 服务器</strong> <br>
相比 Apache，Nginx 使用更少的资源，支持更多的并发连接，体现更高的效率，这点使 Nginx 尤其受到虚拟主机提供商的欢迎。能够支持高达 50,000 个并发连接数的响应，感谢 Nginx 为我们选择了 epoll and kqueue 作为开发模型。</p></li>
<li><p><strong>作为负载均衡服务器</strong> <br>
Nginx 既可以在内部直接支持 Rails 和 PHP，也可以支持作为 HTTP代理服务器对外进行服务。Nginx 用 C 编写, 不论是系统资源开销还是 CPU 使用效率都比 Perlbal 要好的多。</p></li>
<li><p><strong>作为邮件代理服务器</strong> <br>
Nginx 同时也是一个非常优秀的邮件代理服务器（最早开发这个产品的目的之一也是作为邮件代理服务器）。</p></li>
</ul>

<blockquote>
  <p>Nginx 安装非常的简单，配置文件 非常简洁（还能够支持perl语法），Bugs非常少的服务器: Nginx 启动特别容易，并且几乎可以做到7*24不间断运行，即使运行数个月也不需要重新启动。你还能够在 不间断服务的情况下进行软件版本的升级。</p>
</blockquote>



<h4 id="选择nginx的理由">选择Nginx的理由</h4>

<ul><li><p><strong>跨平台</strong> <br>
Nginx 可以在大多数 Unix like OS编译运行，而且也有Windows的移植版本。</p></li>
<li><p><strong>配置异常简单</strong> <br>
非常容易上手。配置风格跟程序开发一样，神一般的配置。</p></li>
<li><p><strong>非阻塞、高并发连接</strong> <br>
数据复制时，磁盘I/O的第一阶段是非阻塞的。官方测试能够支撑5万并发连接，在实际生产环境中跑到2～3万并发连接数.(这得益于Nginx使用了最新的epoll模型)。</p></li>
<li><p><strong>事件驱动</strong></p></li>
<li><p>通信机制采用epoll模型，支持更大的并发连接。</p></li>
<li><p><strong>master/worker结构</strong> <br>
一个master进程，生成一个或多个worker进程。</p></li>
<li><p><strong>内存消耗小</strong> <br>
处理大并发的请求内存消耗非常小。在3万并发连接下，开启的10个Nginx 进程才消耗150M内存（15M*10=150M） 成本低廉：Nginx为开源软件，可以免费使用。而购买F5 BIG-IP、NetScaler等硬件负载均衡交换机则需要十多万至几十万人民币。</p></li>
<li><p><strong>内置的健康检查功能</strong> <br>
如果 Nginx Proxy 后端的某台 Web 服务器宕机了，不会影响前端访问。</p></li>
<li><p><strong>节省带宽</strong> <br>
支持 GZIP 压缩，可以添加浏览器本地缓存的 Header 头。</p></li>
<li><p><strong>稳定性高</strong></p></li>
<li>用于反向代理，宕机的概率微乎其微。</li>
</ul>



<h4 id="nginx不为人知的特点">Nginx不为人知的特点</h4>

<blockquote>
  <ul><li><p>nginx代理和后端web服务器间无需长连接；</p></li>
  <li><p>接收用户请求是异步的，即先将用户请求全部接收下来，再一次性发送后后端web服务器，极大的减轻后端web服务器的压力；</p></li>
  <li><p>发送响应报文时，是边接收来自后端web服务器的数据，边发送给客户端的；</p></li>
  <li><p>网络依赖型低。NGINX对网络的依赖程度非常低，理论上讲，只要能够ping通就可以实施负载均衡，而且可以有效区分内网和外网流量；</p></li>
  <li><p>支持服务器检测。NGINX能够根据应用服务器处理页面返回的状态码、超时信息等检测服务器是否出现故障，并及时返回错误的请求重新提交到其它节点上。</p></li>
  </ul>
</blockquote>



<h4 id="什么是正向代理反向代理">什么是正向代理、反向代理？</h4>

<ul><li><strong>正向代理</strong> <br>


<blockquote>
  正向代理,也就是传说中的代理, 他的工作原理就像一个跳板,简单的说： <br>
  我是一个用户,我访问不了某网站,但是我能访问一个代理服务器。 这个代理服务器呢,他能访问那个我不能访问的网站，于是我先连上代理服务器,告诉他我需要那个无法访问网站的内容。代理服务器去取回来,然后返回给我。 <br>
  从网站的角度,只在代理服务器来取内容的时候有一次记录，有时候并不知道是用户的请求,也隐藏了用户的资料,这取决于代理告不告诉网站。 <br>
  结论就是：正向代理 是一个位于客户端和原始服务器(origin server)之间的服务器，为了从原始服务器取得内容，客户端向代理发送一个请求并指定目标(原始服务器)，然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。 <br>
  <strong>比如</strong>：翻墙软件、goAgent。</blockquote></li>
  </ul>
  

<p><img longdesc="./1-proxy.jpg" alt="Alt text" title="" type="image/jpeg" src="" class=""></p>

<p></p><ul><li><strong>反向代理</strong> <br></li></ul><p></p>

<blockquote>
  例用户访问 <a href="http://ooxx.me/readme" target="_blank">http://ooxx.me/readme</a> <br>
  但ooxx.me上并不存在readme页面 <br>
  他是偷偷从另外一台服务器上取回来,然后作为自己的内容吐给用户 <br>
  但用户并不知情 <br>
  这很正常,用户一般都很笨 <br>
  这里所提到的 ooxx.me 这个域名对应的服务器就设置了反向代理功能 <br>
  结论就是： <br>
  反向代理正好相反，对于客户端而言它就像是原始服务器，并且客户端不需要进行任何特别的设置。客户端向反向代理 的命名空间(name-space)中的内容发送普通请求，接着反向代理将判断向何处(原始服务器)转交请求，并将获得的内容返回给客户端，就像这些内容 原本就是它自己的一样。
  
  </blockquote>


<p><img longdesc="./2-proxy.jpg" alt="Alt text" title="" type="image/jpeg" src="" class=""></p>

<p></p><ul><li><strong>二者区别</strong> <br></li></ul><p></p>

<blockquote>
  <p>正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。正向代理还可以使用缓冲特性减少网络使用率。 <br>
  反向代理的典型用途是将防火墙后面的服务器提供给Internet用户访问。反向代理还可以为后端的多台服务器提供负载平衡，或为后端较慢的服务器提供缓冲服务。 <br>
  正向代理允许客户端通过它访问任意网站并且隐藏客户端自身，因此你必须采取安全措施以确保仅为经过授权的客户端提供服务。 <br>
  反向代理对外都是透明的，访问者并不知道自己访问的是一个代理。
  </p>
</blockquote>

<h4 id="nginx内部进程模型">Nginx内部进程模型</h4>



<p><img longdesc="./process.png" alt="Alt text" title="" type="image/png" src="" class=""></p>



<h4 id="nginx是如何处理一个请求">Nginx是如何处理一个请求？</h4>



<blockquote>
  <p>首先，nginx在启动时，会解析配置文件，得到需要监听的端口与ip地址，然后在nginx的master进程里面，先初始化好这个监控的socket(创建socket，设置addrreuse等选项，绑定到指定的ip地址端口，再listen)，然后再fork(一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程 )出多个子进程出来，然后子进程会竞争accept新的连接。此时，客户端就可以向nginx发起连接了。当客户端与nginx进行三次握手，与nginx建立好一个连接后，此时，某一个子进程会accept成功，得到这个建立好的连接的socket，然后创建nginx对连接的封装，即ngx_connection_t结构体。接着，设置读写事件处理函数并添加读写事件来与客户端进行数据的交换。最后，nginx或客户端来主动关掉连接，到此，一个连接就寿终正寝了。 <br>
  当然，nginx也是可以作为客户端来请求其它server的数据的（如upstream模块），此时，与其它server创建的连接，也封装在ngx_connection_t中。作为客户端，nginx先获取一个ngx_connection_t结构体，然后创建socket，并设置socket的属性（ 比如非阻塞）。然后再通过添加读写事件，调用connect/read/write来调用连接，最后关掉连接，并释放ngx_connection_t。</p>
</blockquote>



<h4 id="nginx的典型应用场景">Nginx的典型应用场景</h4>



<p><img longdesc="./nginx-group.png" alt="Alt text" title="" type="image/png" src="" class=""></p>



<h4 id="nginx的安装">Nginx的安装</h4>

<ul><li><strong>Nginx 的windows安装</strong></li>
</ul>

<blockquote>
  <p>带领大家上网站：<a href="http://nginx.org" target="_blank">http://nginx.org</a>， 使用ablout板块和download板块</p>
</blockquote>

<p><strong>下载nginx并演示</strong></p>



<pre class="prettyprint hljs-dark"><code class="hljs bash">启动Nginx :  start nginx   使用：http://localhost<br>强制关闭Nginx ： nginx <span class="hljs-operator">-s</span> stop<br>安全关闭Nginx : nginx <span class="hljs-operator">-s</span> quit<br>改变配置文件的时候，重启nginx工作进程，来时配置文件生效 : nginx <span class="hljs-operator">-s</span> reload<br>检查nginx的conf目录下的nginx.conf的语法是否正确 ： nginx -t<br>查看nginx进程：tasklist /<span class="hljs-keyword">fi</span> <span class="hljs-string">"imagename eq nginx.exe"</span><br><br>nginx -V : 查看该W<span class="hljs-keyword">in</span>32平台编译版支持哪些模块<br></code></pre>

<ul><li><strong>Nginx 的CentOS7安装</strong></li>
</ul>

<p><strong>安装虚拟机和centOS7</strong></p>

<blockquote>
  <p>准备工作</p>
</blockquote>



<pre class="prettyprint hljs-dark"><code class="hljs stylus"><span class="hljs-id">#yum</span> install net-tools<br>centOS7 获取 firewalld 状态<br><span class="hljs-id">#firewall-cmd</span> --state<br><br><span class="hljs-id">#systemctl</span> stop firewalld<span class="hljs-class">.service</span> #停止firewall<br><span class="hljs-id">#systemctl</span> disable firewalld<span class="hljs-class">.service</span> #禁止firewall开机启动<br><br><span class="hljs-id">#yum</span> install iptables-services #安装<br><span class="hljs-id">#vi</span> /etc/sysconfig/iptables<br>-A INPUT -<span class="hljs-tag">p</span> tcp -m state --state NEW -m tcp --dport <span class="hljs-number">80</span> -j ACCEPT<br><span class="hljs-id">#service</span> iptables restart<br><span class="hljs-id">#service</span> iptables stop<br><br>iptables -V  查看机器是否安装iptables<br></code></pre>

<blockquote>
  <p>开始安装</p>
</blockquote>



<pre class="prettyprint hljs-dark"><code class="hljs stylus"><span class="hljs-id">#yum</span> -y install gcc gcc-c++ autoconf automake<br><span class="hljs-id">#yum</span> -y install zlib zlib-devel openssl openssl-devel pcre-devel<br></code></pre>

<p>gcc : C/c++编译用的 <br>
zlib : Nginx提供gzip模块，需要zlib库的支持 <br>
openssl : Nginx提供ssl功能 <br>
pcre : 支持地址重写rewrite功能</p>



<pre class="prettyprint hljs-dark"><code class="hljs stylus">下载nginx-<span class="hljs-number">1.10</span>.<span class="hljs-number">3</span><span class="hljs-class">.tar</span><span class="hljs-class">.gz</span>并上传到centos7,目录随意，一般/root<br><span class="hljs-id">#tar</span> -zxvf nginx-<span class="hljs-number">1.10</span>.<span class="hljs-number">3</span><span class="hljs-class">.tar</span><span class="hljs-class">.gz</span><br>#./configure --help    #杳看nginx的模块<br><br>安装前须添加一个nginx的运行用户<br><span class="hljs-id">#groupadd</span> -r nginx<br><span class="hljs-id">#useradd</span> -g nginx -r nginx<br><span class="hljs-id">#useradd</span> -s /sbin/nologin -g nginx -r nginx   #免登录<br><br>/sbin/nologin  用户不允许用ssh登录<br><br><span class="hljs-id">#id</span> nginx<br></code></pre>

<blockquote>
  <p>第一步:</p>
</blockquote>



<pre class="prettyprint hljs-dark"><code class="hljs haml">./configure <br>-<span class="ruby">-prefix=<span class="hljs-regexp">/usr<br></span></span>-<span class="ruby"><span class="hljs-regexp">-sbin-path/usr</span><span class="hljs-regexp">/sbin/nginx</span><br></span>-<span class="ruby">-conf-path=<span class="hljs-regexp">/etc/nginx</span><span class="hljs-regexp">/nginx.conf<br></span></span>-<span class="ruby"><span class="hljs-regexp">-error-log-path=/var</span><span class="hljs-regexp">/log/nginx</span><span class="hljs-regexp">/error.log<br></span></span>-<span class="ruby"><span class="hljs-regexp">-pid-path=/var</span><span class="hljs-regexp">/run/nginx</span><span class="hljs-regexp">/nginx.pid<br></span></span>-<span class="ruby"><span class="hljs-regexp">-lock-path=/var</span><span class="hljs-regexp">/lock/nginx</span>.lock<br></span>-<span class="ruby">-user=nginx<br></span>-<span class="ruby">-group=nginx<br></span>-<span class="ruby">-with-http_ssl_module<br></span>-<span class="ruby">-with-http_flv_module<br></span>-<span class="ruby">-with-http_gzip_static_module<br></span>-<span class="ruby">-http-log-path=<span class="hljs-regexp">/var/log</span><span class="hljs-regexp">/nginx/access</span>.log<br></span>-<span class="ruby">-http-client-body-temp-path=<span class="hljs-regexp">/var/tmp</span><span class="hljs-regexp">/nginx/client</span><br></span>-<span class="ruby">-http-proxy-temp-path=<span class="hljs-regexp">/var/tmp</span><span class="hljs-regexp">/nginx/proxy</span><br></span>-<span class="ruby">-http-fastcgi-temp-path=<span class="hljs-regexp">/var/tmp</span><span class="hljs-regexp">/nginx/fcgi</span><br></span>-<span class="ruby">-with-http_stub_status_module<br></span><br><br>或<br>./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module<br><br>prefix 主安装目录<br></code></pre>

<blockquote>
  <p>第二步</p>
</blockquote>



<pre class="prettyprint hljs-dark"><code class="hljs bash"><span class="hljs-comment">#make&amp;&amp;make install</span><br><br>./nginx <span class="hljs-operator">-s</span> stop   停止nginx<br>./nginx <span class="hljs-operator">-s</span> reload  重新载入配置文件<br>./nginx <span class="hljs-operator">-s</span> reopen  重启 Nginx<br><br>查看nginx是否启动<br><span class="hljs-comment">#ps aux|grep nginx</span><br><span class="hljs-comment">#ps -ef|grep nginx    #一个主进程一个工作进程或多个工作进程</span><br><br>nginx -t -c /usr/<span class="hljs-built_in">local</span>/nginx/conf/nginx.conf   <span class="hljs-comment">#检查conf语法</span><br><br><span class="hljs-comment">#kill -9 nginxID     #强制结束所有的nginx进程</span><br><br></code></pre>

<blockquote>
  <p>用<a href="http://ip" target="_blank">http://ip</a>看看nginx是否启动 <br>
  讲讲目录和nginx.conf的大体结构，讲一下下节课的主要内容，要同学们下课了做一下练习。</p>
  
  <ul><li>作业：centos7安装nginx   select poll epoll  区别 IO多路复用的机制</li>
  </ul>
</blockquote></div></body></html>